package day20180131.testInit;

/**
 * Created by 14394 on 2018/1/31.
 */

/*Java虚拟机规范严格规定了有且只有5种场景必须立即对类进行初始化，这4种场景也称为对一个类进行主动引用（其实还有一种场景，不过暂时我还没弄明白这种场景的意思，就先不写了）：

1、使用new关键字实例化对象、读取或者设置一个类的静态字段（被final修饰的静态字段除外）、调用一个类的静态方法的时候

2、使用java.lang.reflect包中的方法对类进行反射调用的时候

3、初始化一个类，发现其父类还没有初始化过的时候

4、虚拟机启动的时候，虚拟机会先初始化用户指定的包含main()方法的那个类

除了上面4种场景外，所有引用类的方式都不会触发类的初始化，称为被动引用，接下来看下被动引用的几个例子：*/

//子类引用父类静态字段，不会导致子类初始化。
public class TestClassInit {

    public static void main(String[] args) {
        System.out.println(Children.value);

        System.out.println(Father.class.getClassLoader());
        System.out.println(Children.class.getClassLoader());
    }
}

class Father{
    public static int value = 123;
    static {
        System.out.println("Father Inited");
    }
}

class Children extends Father{
    static {
        System.out.println("Children Inited");
    }
}
